/**
 * 
 */
package br.com.framework.apresentacao.bean;

import java.io.Serializable;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import br.com.framework.apresentacao.util.FacesMessagesUtil;

/**
 * @author Cleber
 * 
 */
public abstract class BaseBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	protected static final Logger LOGGER = Logger.getLogger(BaseBean.class);

	public static final String DEFAULT_RESOURCE_BUNDLE = "mensagens";
	public static final String PARAM_FACES_REDIRECT_TRUE = "?faces-redirect=true";

	protected FacesMessagesUtil facesMessages;

	/**
	 * 
	 */
	public BaseBean() {
		super();
		this.facesMessages = FacesMessagesUtil.getInstance(DEFAULT_RESOURCE_BUNDLE, 
				getFacesContext().getApplication().getDefaultLocale());
	}
	
	/**
	 * Retorna uma instancia do {@link FacesMessagesUtil}
	 * @return
	 */
	protected FacesMessagesUtil getFacesMessages() {
		return facesMessages;
	}

	/**
	 * Recupera a instância do {@link FacesContext}.
	 * 
	 * @return
	 */
	protected FacesContext getFacesContext() {
		return FacesContext.getCurrentInstance();
	}

	/**
	 * Recupera a instância do {@link ExternalContext}.
	 * 
	 * @return
	 */
	protected ExternalContext getExternalContext() {
		return getFacesContext().getExternalContext();
	}

	/**
	 * Recupera a instância do bean da sessão.
	 * 
	 * @return O HttpSession recuperado.
	 */
	public HttpSession getHttpSession() {
		return (HttpSession) getExternalContext().getSession(true);
	}

	/**
	 * Recupera um bean armazenado na sessão.
	 * 
	 * @param bean
	 *            O nome do bean a ser recuperado.
	 * @return O bean recuperado.
	 */
	public Object getBeanFromSession(String bean) {
		return getExternalContext().getSessionMap().get(bean);
	}

	/**
	 * Recupera um bean armazenado na requisição.
	 * 
	 * @param bean
	 *            O nome do bean a ser recuperado.
	 * @return O bean recuperado.
	 */
	public Object getBeanFromRequest(String bean) {
		return getExternalContext().getRequestMap().get(bean);
	}

	/**
	 * Adiciona um {@link Cookie} no cliente.
	 * 
	 * @param key
	 * 	Chave de identificação do {@link Cookie}
	 * @param value
	 * 	Valor que será armazenado no {@link Cookie}
	 */
	protected void addCookie(String key, String value) {
		HttpServletResponse response = (HttpServletResponse) getExternalContext().getResponse();
		Cookie cookie = new Cookie(key, value);
        response.addCookie(cookie);
    }

    /**
     * Recupera um cookie no cliente.
     *
     * @param key
     *	Chave de identificação do {@link Cookie}
     * @return
     * 	O valor armazenado no {@link Cookie} ou null se não localizado.
     */
    protected String getCookieValue(String key) {
        String result = null;
        HttpServletRequest request = (HttpServletRequest) getExternalContext().getRequest();
        Cookie cookie[] = request.getCookies();
        if (cookie != null) {
            for (int i = 0; i < cookie.length; i++) {
                if (cookie[i].getName().equalsIgnoreCase(key)) {
                    result = cookie[i].getValue();
                }
            }
        }
        return result;
    }
    
    /**
     * Verifica se o usuário logado possui algum dos papeis informados.
     * 
     * @param roles
     * @return
     */
    public boolean isUserInRoles(String... roles) {
    	boolean hasRole = false;
    	for (String role : roles) {
			hasRole = getExternalContext().isUserInRole(role);
			if (hasRole)
				break;
		}
    	return hasRole;
    }
    
    /**
     * Verifica se o usuário logado possui o papel informado
     * @param role
     * @return
     */
    public boolean isUserInRole(String role) {
		// TODO Auto-generated method stub
		return isUserInRoles(new String[] {role});
	}
    
    /**
     * Verifica se o usuário logado possui todos os papeis informados.
     * 
     * @param roles
     * @return
     */
    public boolean isUserInAllRoles(String... roles) {
    	boolean hasAllRoles = false;
    	for (String role : roles) {
			hasAllRoles = isUserInRole(role);
			if (!hasAllRoles) {
				break;
			}
		}
    	return hasAllRoles;
    }

}
